www.gusucode.com > VC 模范QQ做的一个界面-源码程序 > VC 模范QQ做的一个界面-源码程序/code/MyQQ/TabCtrlST.cpp

    //Download by http://www.NewXing.com
// TabCtrlST.cpp : implementation file
//

#include "stdafx.h"
#include "MyQQ.h"
#include "TabCtrlST.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTabCtrlST

CTabCtrlST::CTabCtrlST()
{
	m_pMainPanel = new CMainPanel;
	m_bShowTab = TRUE;
	m_nTabWidth= 28;
	m_nMouseOn = 0;
	m_nCurrent = 0;

	//设置三个标签的矩形区域
	m_TabRect[0] = CRect(0, 25, 28, 25+TAB_SPACE);
	m_TabRect[1] = CRect(0, 25+TAB_SPACE, 28, 25+TAB_SPACE*2);
	m_TabRect[2] = CRect(0, 25+TAB_SPACE*2, 28, 25+TAB_SPACE*3);
}

CTabCtrlST::~CTabCtrlST()
{
	delete m_pMainPanel;
}


BEGIN_MESSAGE_MAP(CTabCtrlST, CTabCtrl)
	//{{AFX_MSG_MAP(CTabCtrlST)
	ON_WM_CREATE()
	ON_WM_MOUSEMOVE()
	ON_WM_PAINT()
	ON_WM_LBUTTONDOWN()
	ON_WM_SIZE()
	ON_WM_NCPAINT()
	ON_WM_MOVING()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTabCtrlST message handlers

BOOL CTabCtrlST::DrawTabButton(CDC *pDC)
{
    CRect rc;
	GetClientRect(&rc);
	CDC memDC;
	CBitmap& bmpTabBk = m_pSkin->TbBkBmp;
	BITMAP bm;
	bmpTabBk.GetBitmap(&bm);
	int cx = bm.bmWidth;
	int cy = bm.bmHeight;

	//画标签栏背景
	memDC.CreateCompatibleDC(pDC);
	CBitmap* OldBitmap = memDC.SelectObject(&bmpTabBk);
	pDC->StretchBlt(0,3,28,rc.Height()-6,&memDC,0,0,cx,cy,SRCCOPY);

	memDC.SelectObject(OldBitmap);
	memDC.DeleteDC();

	CBitmap& TabBmp1_disable= m_pSkin->TbBkBmp1_disable;
	CBitmap& TabBmp1_normal = m_pSkin->TbBkBmp1_normal;
	CBitmap& TabBmp2_normal = m_pSkin->TbBkBmp2_normal;
	CBitmap& TabBmp1_hover  = m_pSkin->TbBkBmp1_hover;
	CBitmap& TabBmp2_hover  = m_pSkin->TbBkBmp2_hover;

	//画每个标签图标的背景
	COLORREF clrMaskColor = RGB(255,0,255);	//用于做透明色
		
	//第一个图标背景
	m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[0].left, m_TabRect[0].top),
				TabBmp1_normal, CPoint(0,0), 
				CSize(m_TabRect[0].Width(), m_TabRect[0].Height()), clrMaskColor);
	//第二个图标背景
	m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[1].left, m_TabRect[1].top),
				TabBmp2_normal, CPoint(0,0), 
				CSize(m_TabRect[1].Width(), m_TabRect[1].Height()), clrMaskColor);
	//第三个图标背景
	m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[2].left, m_TabRect[2].top),
				TabBmp2_normal, CPoint(0,0), 
				CSize(m_TabRect[2].Width(), m_TabRect[2].Height()), clrMaskColor);

	//画鼠标停留其上时的图标背景
	if((m_nMouseOn > -1) && (m_nMouseOn!=m_nCurrent))
	{
		switch(m_nMouseOn)
		{
		case 0:
			m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[m_nMouseOn].left, m_TabRect[m_nMouseOn].top),
					TabBmp1_hover, CPoint(0,0), 
					CSize(m_TabRect[m_nMouseOn].Width(), m_TabRect[m_nMouseOn].Height()), clrMaskColor);
			
			break;
		case 1:
		case 2:
			m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[m_nMouseOn].left, m_TabRect[m_nMouseOn].top),
					TabBmp2_hover, CPoint(0,0), 
					CSize(m_TabRect[m_nMouseOn].Width(), m_TabRect[m_nMouseOn].Height()), clrMaskColor);
			break;

		}
	}
	
	//画当前选中标签的图标背景
	m_pSkin->DrawTransparent(pDC,CPoint(m_TabRect[m_nCurrent].left, m_TabRect[m_nCurrent].top),
			TabBmp1_disable, CPoint(0,0), 
			CSize(m_TabRect[m_nCurrent].Width(), m_TabRect[m_nCurrent].Height()), clrMaskColor);

	//画标签的图标
	pDC->DrawIcon(m_TabRect[0].left+1, m_TabRect[0].top, m_pSkin->m_hIconQQ);
	pDC->DrawIcon(m_TabRect[1].left+1, m_TabRect[1].top, m_pSkin->m_hIconMsc);
	pDC->DrawIcon(m_TabRect[2].left+1, m_TabRect[2].top, m_pSkin->m_hIconDsk);
	
	return TRUE;
}

void CTabCtrlST::DrawBackGround(CDC *pDC, CRect &rc)
{
	pDC->FillSolidRect(rc, m_pSkin->MainBk);

}

void CTabCtrlST::DrawAll(CDC *pDC)
{
	CDC memDC;

	memDC.CreateCompatibleDC(pDC);

	CRect rc;
	GetClientRect(rc);


	CBitmap bm;
	bm.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());

	CBitmap *oldBitmap = memDC.SelectObject(&bm);

	DrawBackGround(&memDC,rc);
		
	memDC.FillSolidRect(CRect(m_nTabWidth, 3, rc.Width(), rc.Height()-3),RGB(255,255,255));
	
	DrawCorner(&memDC);

/*	//画主边框
	CPen MyPen;
	MyPen.CreatePen(PS_SOLID,5,m_pSkin->MainBorder);
	CPen *OldPen = memDC.SelectObject(&MyPen);
	memDC.MoveTo(0,0);
	memDC.LineTo(rc.right,0);
	memDC.LineTo(rc.right,rc.bottom);
	memDC.LineTo(0,rc.bottom);
	memDC.LineTo(0,0);
	memDC.SelectObject(OldPen);
*/	
	//画TAB标签
	if( m_bShowTab )
	{
		DrawTabButton(&memDC);
	}
	

	//显示
	pDC->BitBlt(0, 0, rc.Width(), rc.Height(), &memDC, 0, 0, SRCCOPY);
	memDC.SelectObject(oldBitmap);
	DeleteObject(bm);
	memDC.DeleteDC();
}

void CTabCtrlST::DrawCorner(CDC *pDC)
{

}

int CTabCtrlST::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CTabCtrl::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	// TODO: Add your specialized creation code here

	//取应用程序的Skin对象
	m_pSkin = &(((CMyQQApp *)AfxGetApp())->m_AppSkin);
	

	m_pMainPanel->Create(NULL,NULL,WS_CHILD | WS_VISIBLE,
		CRect(0,0,0,0), this,1010);
//	m_pMainPanel->ShowWindow(SW_SHOW);
	return 0;
}

void CTabCtrlST::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	BOOL bPtInRt = FALSE;
	for(int i=0; i<3; i++)
	{
		if(m_TabRect[i].PtInRect(point))
		{
			m_nMouseOn = i;
			bPtInRt = TRUE;
			break;
		}
	}

	if(!bPtInRt)
	{
		m_nMouseOn = -1;
	}


	UpdateTab();
	CTabCtrl::OnMouseMove(nFlags, point);
}

void CTabCtrlST::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	DrawAll(&dc);
	// Do not call CTabCtrl::OnPaint() for painting messages
}

void CTabCtrlST::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	BOOL bPtInRt = FALSE;
	for(int i=0; i<3; i++)
	{
		if(m_TabRect[i].PtInRect(point))
		{
			m_nCurrent = i;
			bPtInRt = TRUE;
			break;
		}
	}

	if(!bPtInRt)
	{
		m_nMouseOn = -1;
	}


	UpdateTab();
	PageChanged(m_nCurrent);
	CTabCtrl::OnLButtonDown(nFlags, point);
}

void CTabCtrlST::UpdateTab()
{
	CRect rc;
	GetClientRect(&rc);
	InvalidateRect(CRect(rc.left, rc.top, rc.left+m_nTabWidth, rc.bottom));
}

void CTabCtrlST::OnSize(UINT nType, int cx, int cy) 
{
	CTabCtrl::OnSize(nType, cx, cy);
	
//	UpdateTab();
	m_pMainPanel->MoveWindow(CRect(m_nTabWidth, 8, cx, cy-3),TRUE);
	// TODO: Add your message handler code here
	
}

void CTabCtrlST::OnNcPaint() 
{
	// TODO: Add your message handler code here

/*	CRect rcWin, rcClient;
	GetWindowRect(&rcWin);
	GetClientRect(&rcClient);
	CDC *pDC = this->GetWindowDC();
	CDC memDC;
	memDC.CreateCompatibleDC(pDC);

	CBitmap& bmpleft = m_pSkin->sysleftlineBmp;
	CBitmap& bmpright = m_pSkin->sysrightlineBmp;

	BITMAP	bm;
	bmpleft.GetBitmap(&bm);

	CBitmap* OldBitmap = memDC.SelectObject(&bmpleft);

	int  y = 0;
	//画主窗口左边框
	while(y < rc.Height())
	{
		pDC->BitBlt(0,y,5,bm.bmHeight,&memDC,0,0,SRCCOPY);
		y+=bm.bmHeight;
	}
	//画右边框,位图高度与左边框的相同
	memDC.SelectObject(&bmpright);
	y = 0;
	while(y < rc.Height())
	{
		pDC->BitBlt(rc.right - 5, y, 5, bm.bmHeight,&memDC,0,0,SRCCOPY);
		y+=bm.bmHeight;
	}

	memDC.SelectObject(OldBitmap);
	memDC.DeleteDC();
*/
	// Do not call CTabCtrl::OnNcPaint() for painting messages
}

void CTabCtrlST::PageChanged(int NewPage)
{
	m_pMainPanel->ShowWindow((NewPage==0));
}

void CTabCtrlST::OnMoving(UINT fwSide, LPRECT pRect) 
{
	CTabCtrl::OnMoving(fwSide, pRect);
	
	// TODO: Add your message handler code here
	UpdateTab();
}